package com.zsy.leetcode;

/**
 * 7. 整数反转
 * 给你一个 32 位的有符号整数 x ，返回将 x 中的数字部分反转后的结果。
 * 如果反转后整数超过 32 位的有符号整数的范围[−2^31, 2^31− 1] ，就返回 0。
 * 假设环境不允许存储 64 位整数（有符号或无符号）。
 *
 * @author: zhangshuaiyin
 * @date: 2021/4/21 19:47
 */
@SuppressWarnings("all")
public class _7_Reverse_Integer {
    int maxValue = Integer.MAX_VALUE;
    int minValue = Integer.MIN_VALUE;
    public static void main(String[] args) {
        System.out.println(reverse(2147483647));
        System.out.println(reverse(-141231362));
    }

    /**
     * tips: 12345 % 10 = 5; 12345 / 10 = 1234;
     * 最大32位整数为 2147483647，反转后的数据不能大于最大32位整数
     * think: 214748365*10 超过32位最大整数 2147483647, 要提前判断
     * 当判断最后一位时，已经反转的数据不能大于 maxValue/10, 且最后一位不能大于7
     * 当判断最后一位时，已经反转的数据不能小于 minValue/10, 且最后一位不能大于8
     *
     * @param x
     * @return
     */
    public static int reverse(int x) {
        int reversed = 0;
        while (x != 0) {
            // 取出末位数字
            int temp = x % 10;
            //判断是否 大于 最大32位整数
            if (reversed > 214748364 || (reversed == 214748364 && temp > 7)) {
                return 0;
            }
            //判断是否 小于 最小32位整数
            if (reversed < -214748364 || (reversed == -214748364 && temp < -8)) {
                return 0;
            }
            // 反转过来的结果
            reversed = reversed * 10 + temp;
            // 去掉末位数字
            x /= 10;
        }
        return reversed;
    }

    public static int reverseWithString(int x) {
        boolean nagetive = false;
        if (x == 0) {
            return 0;
        }
        String s = Integer.toString(x);
        StringBuilder sb = new StringBuilder();
        for (int i = s.length() - 1; i >= 0; i--) {
            if (s.charAt(i) == '-') {
                nagetive = true;
            } else {
                sb.append(s.charAt(i));
            }
        }
        if (nagetive) {
            sb.insert(0, "-");
        }
        if (Long.parseLong(sb.toString()) > Integer.MAX_VALUE || Long.parseLong(sb.toString()) < Integer.MIN_VALUE) {
            return 0;
        }
        return Integer.parseInt(sb.toString());
    }
}
